<?php

require '../vendor/autoload.php';

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

use Firebase\Auth\Token\Exception\InvalidToken;
use Firebase\Auth\Token\Verifier;
use Kreait\Firebase\Factory;

function getToken(){
	$userId="123";
	$jwt = JWT::encode(['sub' => $userId, 'exp' => time() + 3600], 'your_secret_key', 'HS256');

	echo json_encode(['token' => $jwt]);


}

//getToken();


function getToken1(){
	$key = "huang";  //这里是自定义的一个随机字串，应该写在config文件中的，解密时也会用，相当    于加密中常用的 盐  salt
	$token = [
		"iss"=>"",  //签发者 可以为空
		"aud"=>"", //面象的用户，可以为空
		"kid"=>"111",
		"iat" => time(), //签发时间
		"nbf" => time()+100, //在什么时候jwt开始生效  （这里表示生成100秒后才生效）
		"exp" => time()+7200, //token 过期时间
		"uid" => 123 //记录的userid的信息，这里是自已添加上去的，如果有其它信息，可以再添加数组的键值对
	];
	$jwt = JWT::encode($token,$key,"HS256"); //根据参数生成了 token
	//echo json_encode(['token' => $jwt]);
	return $jwt;
}
    
//echo getToken1();

function verification($jwt)
{
    $key = 'huang';  // key要和签发的时候一样
    //$jwt = "";  // 签发的Token
    try {
        JWT::$leeway = 60;  // 当前时间减去60，把时间留点余地
        $decoded = JWT::decode($jwt, new Key($key, 'HS256'));  // HS256方式，这里要和签发的时候对应
        $arr = (array)$decoded;
        return $arr;
    } catch(\Firebase\JWT\SignatureInvalidException $e) {  // 签名不正确
        echo $e->getMessage();
    }catch(\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
        echo $e->getMessage();
    }catch(\Firebase\JWT\ExpiredException $e) {  // token过期
        echo $e->getMessage();
    }catch(Exception $e) {  // 其他错误
        echo $e->getMessage();
    }
    // Firebase定义了多个throw new，我们可以捕获多个catch来定义问题，catch加入自己的业务
    // 比如token过期可以用当前Token刷新一个新Token
}

verification(getToken1());

?>